Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw β€’ Download


sbapp/md2bbcode/renderers/bbcode.py 0a28ec76f3ea7549bd103e1fa09b69267541dbb7 (0a28ec76) Text, 7.91 KB

Tff7b72from T7ee787mistuneT7ee787.T7ee787core Tff7b72import Te6edf3BaseRenderer
Tff7b72from T7ee787mistuneT7ee787.T7ee787util Tff7b72import Te6edf3escape Tff7b72as Te6edf3escape_textTb4b4b4, Te6edf3striptagsTb4b4b4, Te6edf3safe_entity
Tff7b72from T7ee787urllibT7ee787.T7ee787parse Tff7b72import Te6edf3urljoinTb4b4b4, Te6edf3urlparse


Tff7b72class T56d364BBCodeRendererTb4b4b4(Te6edf3BaseRendererTb4b4b4)Tb4b4b4:
T8b949e"""A renderer for converting Markdown to BBCode."""
Te6edf3_escapeTb4b4b4: Tffa657bool
Te6edf3NAME Tff7b72= Ta5d6ff'Ta5d6ffbbcodeTa5d6ff'

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3escapeTff7b72=Tff7b72FalseTb4b4b4, Te6edf3domainTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Te6edf3BBCodeRendererTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_escape Tff7b72= Te6edf3escape
Tff7b72selfTff7b72.Td2a8ffdomain Tff7b72= Te6edf3domain

Tff7b72def Td2a8ffrender_tokenTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tokenTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4:
Te6edf3func Tff7b72= Tff7b72selfTff7b72.Td2a8ff_get_methodTb4b4b4(Te6edf3tokenTb4b4b4[Ta5d6ff'Ta5d6fftypeTa5d6ff'Tb4b4b4]Tb4b4b4)
Te6edf3attrs Tff7b72= Te6edf3tokenTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffattrsTa5d6ff'Tb4b4b4)

Tff7b72if Ta5d6ff'Ta5d6ffrawTa5d6ff' Tff7b72in Te6edf3tokenTb4b4b4:
Te6edf3text Tff7b72= Te6edf3tokenTb4b4b4[Ta5d6ff'Ta5d6ffrawTa5d6ff'Tb4b4b4]
Tff7b72elif Ta5d6ff'Ta5d6ffchildrenTa5d6ff' Tff7b72in Te6edf3tokenTb4b4b4:
Te6edf3text Tff7b72= Tff7b72selfTff7b72.Td2a8ffrender_tokensTb4b4b4(Te6edf3tokenTb4b4b4[Ta5d6ff'Ta5d6ffchildrenTa5d6ff'Tb4b4b4]Tb4b4b4, Te6edf3stateTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3attrsTb4b4b4:
Tff7b72return Te6edf3funcTb4b4b4(Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3funcTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3attrsTb4b4b4:
Tff7b72return Te6edf3funcTb4b4b4(Te6edf3textTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3funcTb4b4b4(Te6edf3textTb4b4b4)

Tff7b72def Td2a8ffsafe_urlTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3urlTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# Simple URL sanitization
Tff7b72if Te6edf3urlTff7b72.Td2a8ffstartswithTb4b4b4(Tb4b4b4(Ta5d6ff'Ta5d6ffjavascript:Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffvbscript:Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffdata:Ta5d6ff'Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff#harmful-linkTa5d6ff'
T8b949e# Check if the URL is absolute by looking for a netloc part in the URL
Tff7b72if Tff7b72not Te6edf3urlparseTb4b4b4(Te6edf3urlTb4b4b4)Tff7b72.Td2a8ffnetlocTb4b4b4:
Te6edf3url Tff7b72= Te6edf3urljoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdomainTb4b4b4, Te6edf3urlTb4b4b4)
Tff7b72return Te6edf3url

Tff7b72def Td2a8fftextTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_escapeTb4b4b4:
Tff7b72return Te6edf3escape_textTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72return Te6edf3text

Tff7b72def Td2a8ffemphasisTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[i]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/i]Ta5d6ff'

Tff7b72def Td2a8ffstrongTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[b]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/b]Ta5d6ff'

Tff7b72def Td2a8fflinkTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3urlTb4b4b4: Tffa657strTb4b4b4, Te6edf3titleTff7b72=Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[url=Ta5d6ff' Tff7b72+ Tff7b72selfTff7b72.Td2a8ffsafe_urlTb4b4b4(Te6edf3urlTb4b4b4) Tff7b72+ Ta5d6ff'Ta5d6ff]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/url]Ta5d6ff'

Tff7b72def Td2a8ffimageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3urlTb4b4b4: Tffa657strTb4b4b4, Te6edf3titleTff7b72=Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3alt_text Tff7b72= Ta5d6fffTa5d6ff'Ta5d6ff alt=Ta5d6ff"Tffd700{Te6edf3textTffd700}Ta5d6ff"Ta5d6ff' Tff7b72if Te6edf3text Tff7b72else Ta5d6ff'Ta5d6ff'
Te6edf3img_tag Tff7b72= Ta5d6fffTa5d6ff'Ta5d6ff[imgTffd700{Te6edf3alt_textTffd700}Ta5d6ff]Ta5d6ff' Tff7b72+ Tff7b72selfTff7b72.Td2a8ffsafe_urlTb4b4b4(Te6edf3urlTb4b4b4) Tff7b72+ Ta5d6ff'Ta5d6ff[/img]Ta5d6ff'
T8b949e# Check if alt text starts with 'pixel' and treat it as pixel art
Tff7b72if Te6edf3text Tff7b72and Te6edf3textTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff'Ta5d6ffpixelTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ff[pixelate]Tffd700{Te6edf3img_tagTffd700}Ta5d6ff[/pixelate]Ta5d6ff'
Tff7b72return Te6edf3img_tag

Tff7b72def Td2a8ffcodespanTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[icode]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/icode]Ta5d6ff'

Tff7b72def Td2a8fflinebreakTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Tffea00\nTa5d6ff'

Tff7b72def Td2a8ffsoftbreakTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff'

Tff7b72def Td2a8ffinline_htmlTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3htmlTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_escapeTb4b4b4:
Tff7b72return Te6edf3escape_textTb4b4b4(Te6edf3htmlTb4b4b4)
Tff7b72return Te6edf3html

Tff7b72def Td2a8ffparagraphTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Te6edf3text Tff7b72+ Ta5d6ff'Tffea00\nTffea00\nTa5d6ff'

Tff7b72def Td2a8ffheadingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3levelTb4b4b4: Tffa657intTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if T79c0ff1 Tff7b72<Tff7b72= Te6edf3level Tff7b72<Tff7b72= T79c0ff3Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff[HEADING=Tffd700{Te6edf3levelTffd700}Ta5d6ff]Tffd700{Te6edf3textTffd700}Ta5d6ff[/HEADING]Tffea00\nTa5d6ff"
Tff7b72elseTb4b4b4:
T8b949e# Handle cases where level is outside 1-3
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff[HEADING=3]Tffd700{Te6edf3textTffd700}Ta5d6ff[/HEADING]Tffea00\nTa5d6ff"
Tff7b72def Td2a8ffblank_lineTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff'
Tff7b72def Td2a8ffthematic_breakTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[hr][/hr]Tffea00\nTa5d6ff'
Tff7b72def Td2a8ffblock_textTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Te6edf3text
Tff7b72def Td2a8ffblock_codeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3codeTb4b4b4: Tffa657strTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# Renders blocks of code using the language specified in Markdown
Te6edf3special_cases Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffplaintextTa5d6ff'Tb4b4b4: Tff7b72None T8b949e# Default [CODE]
Tb4b4b4}

Tff7b72if Ta5d6ff'Ta5d6ffinfoTa5d6ff' Tff7b72in Te6edf3attrsTb4b4b4:
Te6edf3lang_info Tff7b72= Te6edf3safe_entityTb4b4b4(Te6edf3attrsTb4b4b4[Ta5d6ff'Ta5d6ffinfoTa5d6ff'Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3lang Tff7b72= Te6edf3lang_infoTff7b72.Td2a8ffsplitTb4b4b4(Tff7b72NoneTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
T8b949e# Check if the language needs special handling
Te6edf3bbcode_lang Tff7b72= Te6edf3special_casesTff7b72.Td2a8ffgetTb4b4b4(Te6edf3langTb4b4b4, Te6edf3langTb4b4b4) T8b949e# Use the special case if it exists, otherwise use lang as is
Tff7b72if Te6edf3bbcode_langTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff[CODE=Tffd700{Te6edf3bbcode_langTffd700}Ta5d6ff]Tffd700{Te6edf3escape_textTb4b4b4(Te6edf3codeTb4b4b4)Tffd700}Ta5d6ff[/CODE]Tffea00\nTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff[CODE]Tffd700{Te6edf3escape_textTb4b4b4(Te6edf3codeTb4b4b4)Tffd700}Ta5d6ff[/CODE]Tffea00\nTa5d6ff"
Tff7b72elseTb4b4b4:
T8b949e# No language specified, render with a generic [CODE] tag
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff[CODE]Tffd700{Te6edf3escape_textTb4b4b4(Te6edf3codeTb4b4b4)Tffd700}Ta5d6ff[/CODE]Tffea00\nTa5d6ff"

Tff7b72def Td2a8ffblock_quoteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[QUOTE]Tffea00\nTa5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/QUOTE]Tffea00\nTa5d6ff'

Tff7b72def Td2a8ffblock_htmlTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3htmlTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_escapeTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff<p>Ta5d6ff' Tff7b72+ Te6edf3escape_textTb4b4b4(Te6edf3htmlTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff'Ta5d6ff</p>Tffea00\nTa5d6ff'
Tff7b72return Te6edf3html Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'

Tff7b72def Td2a8ffblock_errorTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[color=red][icode]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/icode][/color]Tffea00\nTa5d6ff'

Tff7b72def Td2a8fflistTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3orderedTb4b4b4: Tffa657boolTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# For ordered lists, always use [list=1] to get automatic sequential numbering
T8b949e# For unordered lists, use [list]
Te6edf3tag Tff7b72= Ta5d6ff'Ta5d6fflist=1Ta5d6ff' Tff7b72if Te6edf3ordered Tff7b72else Ta5d6ff'Ta5d6fflistTa5d6ff'
Tff7b72return Ta5d6ff'Ta5d6ff[Tffd700{}Ta5d6ff]Ta5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3tagTb4b4b4) Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/list]Tffea00\nTa5d6ff'

Tff7b72def Td2a8fflist_itemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[*]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'
Tff7b72def Td2a8ffstrikethroughTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[s]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/s]Ta5d6ff'
Tff7b72def Td2a8ffmarkTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# Simulate the mark effect with a background color in BBCode
Tff7b72return Ta5d6ff'Ta5d6ff[mark]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/mark]Ta5d6ff'

Tff7b72def Td2a8ffinsertTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# Use underline to represent insertion
Tff7b72return Ta5d6ff'Ta5d6ff[u]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/u]Ta5d6ff'

Tff7b72def Td2a8ffsuperscriptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[sup]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/sup]Ta5d6ff'

Tff7b72def Td2a8ffsubscriptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[sub]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/sub]Ta5d6ff'
Tff7b72def Td2a8ffinline_spoilerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[ISPOILER]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/ISPOILER]Ta5d6ff'

Tff7b72def Td2a8ffblock_spoilerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[SPOILER]Tffea00\nTa5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff[/SPOILER]Ta5d6ff'

Tff7b72def Td2a8fffootnote_refTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3indexTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
T8b949e# Use superscript for the footnote reference
Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ff[sup][u][JUMPTO=fn-Tffd700{Te6edf3indexTffd700}Ta5d6ff]Tffd700{Te6edf3indexTffd700}Ta5d6ff[/JUMPTO][/u][/sup]Ta5d6ff'

Tff7b72def Td2a8fffootnotesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e# Optionally wrap all footnotes in a specific section if needed
Tff7b72return Ta5d6ff'Ta5d6ff[b]Footnotes:[/b]Tffea00\nTa5d6ff' Tff7b72+ Te6edf3text

Tff7b72def Td2a8fffootnote_itemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3indexTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
T8b949e# Define the footnote with an anchor at the end of the document
Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ff[ANAME=fn-Tffd700{Te6edf3indexTffd700}Ta5d6ff]Tffd700{Te6edf3indexTffd700}Ta5d6ff[/ANAME]. Tffd700{Te6edf3textTffd700}Ta5d6ff'
Tff7b72def Td2a8fftableTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3childrenTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)Tb4b4b4:
T8b949e# Starting with a full-width table by default if not specified
T8b949e# width = attrs.get('width', '100%') # comment out until XF 2.3
T8b949e# return f'[TABLE width="{width}"]\n' + children + '[/TABLE]\n' # comment out until XF 2.3
Tff7b72return Ta5d6ff'Ta5d6ff[TABLE]Tffea00\nTa5d6ff' Tff7b72+ Te6edf3children Tff7b72+ Ta5d6ff'Ta5d6ff[/TABLE]Tffea00\nTa5d6ff'

Tff7b72def Td2a8fftable_headTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3childrenTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[TR]Tffea00\nTa5d6ff' Tff7b72+ Te6edf3children Tff7b72+ Ta5d6ff'Ta5d6ff[/TR]Tffea00\nTa5d6ff'

Tff7b72def Td2a8fftable_bodyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3childrenTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3children

Tff7b72def Td2a8fftable_rowTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3childrenTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[TR]Tffea00\nTa5d6ff' Tff7b72+ Te6edf3children Tff7b72+ Ta5d6ff'Ta5d6ff[/TR]Tffea00\nTa5d6ff'

Tff7b72def Td2a8fftable_cellTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4, Te6edf3alignTff7b72=Tff7b72NoneTb4b4b4, Te6edf3headTff7b72=Tff7b72FalseTb4b4b4, Tff7b72*Tff7b72*Te6edf3attrsTb4b4b4)Tb4b4b4:
T8b949e# BBCode does not support direct cell alignment,
T8b949e# use [LEFT], [CENTER], or [RIGHT] tags

T8b949e# Use th for header cells and td for normal cells
Te6edf3tag Tff7b72= Ta5d6ff'Ta5d6ffTHTa5d6ff' Tff7b72if Te6edf3head Tff7b72else Ta5d6ff'Ta5d6ffTDTa5d6ff'

T8b949e# Initialize alignment tags
Te6edf3alignment_start Tff7b72= Ta5d6ff'Ta5d6ff'
Te6edf3alignment_end Tff7b72= Ta5d6ff'Ta5d6ff'

Tff7b72if Te6edf3align Tff7b72== Ta5d6ff'Ta5d6ffcenterTa5d6ff'Tb4b4b4:
Te6edf3alignment_start Tff7b72= Ta5d6ff'Ta5d6ff[CENTER]Ta5d6ff'
Te6edf3alignment_end Tff7b72= Ta5d6ff'Ta5d6ff[/CENTER]Ta5d6ff'
Tff7b72elif Te6edf3align Tff7b72== Ta5d6ff'Ta5d6ffrightTa5d6ff'Tb4b4b4:
Te6edf3alignment_start Tff7b72= Ta5d6ff'Ta5d6ff[RIGHT]Ta5d6ff'
Te6edf3alignment_end Tff7b72= Ta5d6ff'Ta5d6ff[/RIGHT]Ta5d6ff'
Tff7b72elif Te6edf3align Tff7b72== Ta5d6ff'Ta5d6ffleftTa5d6ff'Tb4b4b4:
Te6edf3alignment_start Tff7b72= Ta5d6ff'Ta5d6ff[LEFT]Ta5d6ff'
Te6edf3alignment_end Tff7b72= Ta5d6ff'Ta5d6ff[/LEFT]Ta5d6ff'

Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ff[Tffd700{Te6edf3tagTffd700}Ta5d6ff]Tffd700{Te6edf3alignment_startTffd700}Tffd700{Te6edf3textTffd700}Tffd700{Te6edf3alignment_endTffd700}Ta5d6ff[/Tffd700{Te6edf3tagTffd700}Ta5d6ff]Tffea00\nTa5d6ff'

Tff7b72def Td2a8fftask_list_itemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3checkedTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# Using emojis to represent the checkbox
Te6edf3checkbox_emoji Tff7b72= Ta5d6ff'Ta5d6ffπŸ—ΉTa5d6ff' Tff7b72if Te6edf3checked Tff7b72else Ta5d6ff'Ta5d6ff☐Ta5d6ff'
Tff7b72return Te6edf3checkbox_emoji Tff7b72+ Ta5d6ff'Ta5d6ff Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'

Tff7b72def Td2a8ffdef_listTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e# No specific BBCode tag for <dl>, so we just use the plain text grouping
Tff7b72return Ta5d6ff'Tffea00\nTa5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'

Tff7b72def Td2a8ffdef_list_headTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[b]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/b]Ta5d6ff' Tff7b72+ Ta5d6ff'Ta5d6ff Ta5d6ff' Tff7b72+ Ta5d6ff'Ta5d6ff:Ta5d6ff' Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'

Tff7b72def Td2a8ffdef_list_itemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff[INDENT]Ta5d6ff' Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff'Ta5d6ff[/INDENT]Tffea00\nTa5d6ff'
Tff7b72def Td2a8ffabbrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4: Tffa657strTb4b4b4, Te6edf3titleTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Te6edf3titleTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ff[abbr=Tffd700{Te6edf3titleTffd700}Ta5d6ff]Tffd700{Te6edf3textTffd700}Ta5d6ff[/abbr]Ta5d6ff'
Tff7b72return Te6edf3text


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────